#ifndef _SM_GPIO_H_
#define _SM_GPIO_H_

#include "driver/gpio.h"
#include "esp_err.h"
#include "esp_event.h"
#include "freertos/event_groups.h"

enum
{
	GPIO_EVENT_IDLE_BIT = 0x0,
	GPIO_EVENT_TRIGGER_BIT = 0x1,
};

typedef struct 
{
	gpio_num_t 			pin_num;
	gpio_mode_t 		mode;       
	gpio_pullup_t 		pull_up_en;    
	gpio_pulldown_t 	pull_down_en;
	gpio_int_type_t 	intr_type;
	EventGroupHandle_t 	event_handle;
}sm_gpio_obj;

/**
 * 函数名		：sm_gpio_init
 * 作用			：用于gpio的初始化操作
 * 描述			：无
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 返回值		： @ref esp_err_t
*/
esp_err_t sm_gpio_init(sm_gpio_obj obj);


esp_err_t sm_gpio_set_pp_output(gpio_num_t io_num);
esp_err_t sm_gpio_set_input(gpio_num_t io_num,gpio_int_type_t intr);

/**
 * 函数名		：sm_gpio_set_level
 * 作用			：设置gpio的电平状态
 * 描述			：obj对象要具有输出功能才有效
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 				 level	--	0 或 1
 * 返回值		： @ref esp_err_t
*/
esp_err_t sm_gpio_set_level(sm_gpio_obj obj,uint32_t level);

/**
 * 函数名		：sm_gpio_get_level
 * 作用			：读取gpio的电平状态
 * 描述			：obj对象要具有输入功能才有效
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 返回值		： @ref esp_err_t
*/
esp_err_t sm_gpio_get_level(sm_gpio_obj obj);

/**
 * 函数名		：sm_gpio_trigger
 * 作用			：gpio电平翻转
 * 描述			：obj对象要具有输入输出功能才有效
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 返回值		： @ref esp_err_t
*/
esp_err_t sm_gpio_trigger(sm_gpio_obj obj);

/**
 * 函数名		：sm_gpio_register_event
 * 作用			：注册一个gpio事件
 * 描述			：obj对象元素中,intr_type != GPIO_INTR_DISABLE才有效
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 返回值		： @ref esp_err_t
*/
esp_err_t sm_gpio_register_event(sm_gpio_obj *obj);

/**
 * 函数名		：sm_gpio_get_event_bits
 * 作用			：获取事件位
 * 描述			：获取完成后,会自动清空该位
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 返回值		： @ref EventBits_t
*/
EventBits_t sm_gpio_get_event_bits(sm_gpio_obj *obj);

/**
 * 函数名		：sm_gpio_set_event_bits
 * 作用			：设置事件位
 * 描述			： state @ref GPIO_EVENT_IDLE_BIT 或 GPIO_EVENT_TRIGGER_BIT
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 				 state -- 设置状态值
 * 返回值		： @ref EventBits_t
*/
EventBits_t sm_gpio_set_event_bits(sm_gpio_obj *obj,const uint32_t state);

/**
 * 函数名		：sm_gpio_wait_event_bits
 * 作用			：阻塞等待事件位被标志
 * 描述			：等待超时为 portMAX_DELAY
 * 				 state @ref GPIO_EVENT_IDLE_BIT 或 GPIO_EVENT_TRIGGER_BIT
 * 入口参数		：obj 	-- sm_gpio_obj结构体指针
 * 				 state -- 等待的状态值
 * 返回值		： @ref EventBits_t
*/
EventBits_t sm_gpio_wait_event_bits(sm_gpio_obj *obj,const uint32_t state);


#endif

